/**********************************************************************************\
** 文件名称: mycmd.c
** 创建人员: YCG
** 创建日期: 2018-12-22
** 文档描述:
1.用uint32_t类型定义一个存放命令的缓存，每一位代表一个命令，一共可以定义32个命令
2.前CMD_DAT_NUM个命令可以携带一个32位的数据
3.注意，读取数据即包括了读取命令
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#include "mycmd.h"

/*******************************************************************************
** 函数名称: Cmd_Create
** 功能描述: 创建一个CMD控制对象
** 参数说明: yCmdHead: [输入/出]
             ySendCallBack：回调函数，用来快速处理命令
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-01-19
********************************************************************************/
CmdHead_t* Cmd_Create(void (*ySendCallBack)(CmdHead_t* yCmdHead, uint8_t yCmd)) {

    CmdHead_t *yCmdHead = MyMalloc(sizeof(CmdHead_t));     //获取内存空间
    if(yCmdHead != NULL) {                                 //如果成功分配到空间
        yCmdHead->Cmd = 0 ;                                //初始化
        yCmdHead->SendCallBack = ySendCallBack;            //初始化回调函数
        memset(yCmdHead->CmdDat, NULL, CMD_DAT_NUM);     //命令数据初始化
    }
    return yCmdHead;
}

/*******************************************************************************
** 函数名称: Cmd_Init
** 功能描述: 用户自己定义的CMD控制对象初始化
** 参数说明: yCmdHead: [输入/出] 
**			     yCmd: [输入/出] 
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-01-20
********************************************************************************/
void Cmd_Init(CmdHead_t *yCmdHead,void (*ySendCallBack)(CmdHead_t* yCmdHead, uint8_t yCmd)) {
    if(yCmdHead != NULL) {                                 //如果成功分配到空间
        yCmdHead->Cmd = 0 ;                                //初始化
        yCmdHead->SendCallBack = ySendCallBack;            //初始化回调函数
        memset(yCmdHead->CmdDat, NULL, CMD_DAT_NUM);     //命令数据初始化
    }
}
/*******************************************************************************
** 函数名称: Cmd_SendDat
** 功能描述: 发送一个带数据的命令
** 参数说明: yCmdHead: [输入/出]
**			 yCmd: [输入/出]
**			 yDat: [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-01-19
********************************************************************************/
void Cmd_SendDat(CmdHead_t* yCmdHead, uint8_t yCmd, uint8_t yDat) {

    yCmdHead->Cmd |= (0x00000001 << yCmd);  //保存指令

    if(yCmd < CMD_DAT_NUM) {                //判断能不能携带数据
        yCmdHead->CmdDat[yCmd] = yDat;      //保存指令数据
    }

    if(yCmdHead->SendCallBack != NULL) {    //调用发送回调函数
       yCmdHead->SendCallBack(yCmdHead, yCmd);
    }
}

/*******************************************************************************
** 函数名称: Cmd_SendCmd
** 功能描述: 只发送命令，不带数据
** 参数说明: yCmdHead: [输入/出]
**			 yCmd: [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-01-19
********************************************************************************/
void Cmd_SendCmd(CmdHead_t* yCmdHead, uint8_t yCmd) {

    yCmdHead->Cmd |= (0x00000001 << yCmd);     //保存指令
    if(yCmd < CMD_DAT_NUM) {                   //判断能不能携带数据
        yCmdHead->CmdDat[yCmd] = NULL;         //没有指令数据
    }

    if(yCmdHead->SendCallBack != NULL) {       //调用发送回调函数
        yCmdHead->SendCallBack(yCmdHead, NULL);
    }
}

/*******************************************************************************
** 函数名称: Cmd_IsSet
** 功能描述: 判断命令是否被设置了
** 参数说明: yCmdHead: [输入/出]
**			 yCmd: [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-01-19
********************************************************************************/
uint8_t Cmd_IsSet(CmdHead_t* yCmdHead, uint8_t yCmd) {
    uint8_t yReturn = CMD_FALSE;
    if(yCmdHead->Cmd & (0x00000001 << yCmd)) {
        yReturn = CMD_TRUE;
    }
    return yReturn;
}

/*******************************************************************************
** 函数名称: Cmd_ReadCmd
** 功能描述: 获取命令，并清除
** 参数说明: yCmdHead: [输入/出]
**			 yCmd: [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-01-19
********************************************************************************/
uint8_t Cmd_ReadCmd(CmdHead_t* yCmdHead, uint8_t yCmd) {
    uint8_t yReturn = CMD_FALSE;
    if(yCmdHead->Cmd & (0x00000001 << yCmd)) {
        yCmdHead->Cmd &= ~(0x00000001 << yCmd);
        yReturn = CMD_TRUE;
    }
    return yReturn;
}

/*******************************************************************************
** 函数名称: Cmd_ReadDat
** 功能描述: 获取命令和数据，都清除掉
** 参数说明: yCmdHead: [输入/出]
**			 yCmd: [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-01-19
********************************************************************************/
uint8_t Cmd_ReadDat(CmdHead_t* yCmdHead, uint8_t yCmd) {
    uint8_t yReturn = NULL;
    if(yCmdHead->Cmd & (0x00000001 << yCmd)) {
        yCmdHead->Cmd &= ~(0x00000001 << yCmd);
        if(yCmd < CMD_DAT_NUM) {               //判断能不能携带数据
            yReturn = yCmdHead->CmdDat[yCmd];
            yCmdHead->CmdDat[yCmd] = NULL;
        }
    }
    return yReturn;
}

/********************************End of File************************************/
